package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.Usuario;


public class UsuarioOperaciones extends ActionSupport implements SessionAware {

	private static final long serialVersionUID = 1L;
	private Map<String, Object> userSession;
	private Usuario usuario;
	
	private String nombreUsuario;
	private String claveUsuario;
	private String confirmacion;
	private String email;
	
	private Collection<String> errores;

	
	public Usuario getUsuario() { return this.usuario; }	

    public void setNombreUsuario(String s) { this.nombreUsuario = s; }
    public void setClaveUsuario(String s) { this.claveUsuario = s; }
    public void setConfirmacion(String s) { this.confirmacion = s; }
    public void setEmail(String s) { this.email = s; }
    
    public String getNombreUsuario() { return this.nombreUsuario; }
    public String getEmail() { return this.email; }
   

    /**
     * Crea un usuario
     * @return  actionerror
     */
    public String usuarioCrear() {
    	String res = SUCCESS;
    	this.errores = new ArrayList<String>();    	
    	if ( !comprobacionesCrear() ) {    		
    		res = ERROR;
    	} else {
			try {
				usuario = Usuario.crear(this.nombreUsuario, this.claveUsuario, this.email, true);
			} catch (SQLException e) {
				error("Error al crear el usuario: " + e);
				res = ERROR;
			}
    	}    	
    	return res;
    }
    
    /**
     * Desactiva un usuario
     * @return  actionerror
     */
    public String usuarioDesactivar() {
    	String res = SUCCESS;
    	this.errores = new ArrayList<String>();
    	usuario = (Usuario) userSession.get("usuario");
    	if ( usuario == null ) {
    		error("Para borrar el usuario, primero tiene que logarse");
    		res = ERROR;
    	} else {
    		usuario.setActivo(false);
			try {
				usuario.update();
			} catch (SQLException e) {
				error("Error al desactivar el usuario: "  + e);
				res = ERROR;
			}    		
    	}    	
    	return res;
    }
    
    /**
     * Modifica un usuario
     * @return  actionerror
     */
    public String usuarioModificar() {
    	String res = SUCCESS;    	
    	this.errores = new ArrayList<String>();
    	usuario = (Usuario) userSession.get("usuario");
    	if ( usuario == null ) {
    		error("Para modificar el usuario, primero tiene que logarse");
    		res = ERROR;
    	} else {
    		if ( !comprobacionesModificar() ) {
    			res = ERROR;    			
    		} else {
    			if ( this.nombreUsuario.length() > 0 ) {
    				usuario.setUsuario(this.nombreUsuario);
    			}
    			if ( this.claveUsuario.length() > 0 ) {
    				usuario.setPassword(this.claveUsuario);
    			}
    			if ( this.email.length() > 0 ) {
    				usuario.setEmail(this.email);
    			}
    			try {
					usuario.update();
				} catch (SQLException e) {
					error("Error al modificar los datos del usuario: "  + e);
					res = ERROR;
				}
    		}
    	}
    	return res;
    }
    
    
    
    
    private boolean comprobacionesCrear() {
    	boolean res = true;    	
    	if ( !comprobacionesNombreUsuario() ) {
    		res = false;
    	} else if ( !comprobacionesClaveUsuario() ) {
    		res = false;
    	} else if ( !comprobacionesEmail() )  {
    		res = false;
    	}
    	return res;
    }

    private boolean comprobacionesModificar() {
    	boolean res = true;
    	//la modificacion del usuario puede ponerse como NO opcion
    	// pero lo dejo aqui para que lo veais vosotros mismos
    	if ( this.nombreUsuario.length() > 0 && !comprobacionesNombreUsuario() ) {
    		res = false;
    	}
    	if ( this.claveUsuario.length() > 0 && !comprobacionesClaveUsuario() ){
    		res = false;
    	}
    	if ( !comprobacionesEmail() ) {
    		res = false;
    	}    		
    	return res;
    }
    
    private boolean comprobacionesNombreUsuario() {
    	boolean res = true;
    	if ( this.nombreUsuario.length() < 3 ) {
    		errorNombre("El usuario tiene que tener al menos 3 caracteres");
    		res = false;
    	} else {
    		try {
				Usuario usuarioEncontrado = Usuario.buscarPorNombreUsuario(this.nombreUsuario);
				if ( usuarioEncontrado != null ) {
					errorNombre("El nombre de usuario ya existe.");
		    		res = false;					
				}
			} catch (SQLException e) {
				error("Error al comprobar el usuario: " + e);
				res = false;
			}
    	}
    	return res;
    }
    
    private boolean comprobacionesClaveUsuario() {
    	boolean res = true;
    	if ( this.claveUsuario.length() < 3 ) {
    		error("La clave tiene que tener al menos 3 caracteres");
    		res = false;
    	} else if ( !this.claveUsuario.equals(this.confirmacion) ) {
    		error("La clave y la confirmación NO coinciden.");
    		res = false;
    	}
    	return res;
    }
    
    private boolean comprobacionesEmail() {
    	boolean res = true;
    	if ( this.email.length() > 0 && !(this.email.contains("@") && this.email.contains(".")) ) {
    		errorEmail("El correo indicado NO es correcto");
    		res = false;
    	}
    	return res;
    }

    
    private void errorNombre(String igm) {
   		this.nombreUsuario = "";
   		error(igm);
    }
    private void errorEmail(String igm) {
   		this.email = "";
   		error(igm);
    }
    
    private void error(String igm) {
    	errores.add(igm);
    	setActionErrors(errores);
    }

	@Override
	public void setSession(Map<String, Object> session) {
		userSession = session;		
	}

    
}
